package cn.tedu.baking.aop;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

/**
 *  切面类:  用于定义某些方法需要扩展使用的一些功能  例如 计算耗时的功能
 *  1.需要给类上方添加@Aspect注解,标记当前类是切面类
 *  2.切入点: 指的是切入功能的位置 , 目前以类为单位通知,那么该类下所有方法都可以使用通知的功能
 *  3.通知:  指的是切入功能的逻辑,写在通知方法中.
 */
@Aspect
@Component
public class SysTimeAspect {
    //@Pointcut 注解一般都加在方法上,在注解中定义切入点
    //1.方法的定义 就是普通方法,无需写任何的定义
    //2.注解中写的内容称之为表达式,通过该表达式可以指定具体切入点
//    @Pointcut("bean(testController)")
//    @Pointcut("execution(* cn.tedu.baking.controller.TestController.wan*())")
    @Pointcut("@annotation(RequiredTime)")//以RequiredTime注解标记的方法当做切入点
    private void timePointCut(){} //普通的方法

    @Around("timePointCut()") //该注解定义在认为是通知方法的上方,需要填入通知的切入点
    public Object notice(ProceedingJoinPoint joinPoint) throws Throwable { //通知方法
        long start = System.currentTimeMillis();
        joinPoint.proceed();//joinPoint 可以理解为 wan1 或 wan2 方法,proceed()方法是用来开始调用的意思
        long end = System.currentTimeMillis();
        System.out.println("共耗时:"+(end -start)+"ms");

        return null;
    }

}
